package org.zhuzx.util;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 先入先出消费队列，按入队次序执行消费任务。
 * @see org.zhuzx.util.AbstractConsumerQueue
 * @author zhuzx 2018年09月08日
 */
public abstract class AbstractFifoConsumerQueue<E> extends AbstractConsumerQueue<E> {
	
	private boolean useAbortPolicy;
	
	/**
	 * 构建固定大小的阻塞队列并启动基本数量的消费线程（常驻运行）
	 */
	protected AbstractFifoConsumerQueue() {
		this(DEFAULT_QUEUE_SIZE);
	}
	
	/**
	 * 构建固定大小的阻塞队列并启动基本数量的消费线程（常驻运行）
	 * @param size 固定队列容量
	 */
	protected AbstractFifoConsumerQueue(int size) {
		this(size, false);
	}
	
	/**
	 * 构建固定大小的阻塞队列并启动基本数量的消费线程（常驻运行）
	 * @param size 固定队列容量
	 * @param useAbortPolicy 若使用放弃策略，当满容量时继续推入元素会马上返回false。若不使用放弃策略则自动使用阻塞策略。
	 */
	protected AbstractFifoConsumerQueue(int size, boolean useAbortPolicy) {
		BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(size);
		this.useAbortPolicy = useAbortPolicy;
		super.initExecutor(queue);
	}
	
	protected RejectedExecutionHandler getRejectedExecutionHandler() {
		return useAbortPolicy ? new ThreadPoolExecutor.AbortPolicy() :
				super.getRejectedExecutionHandler();
	}
	
}